package com.xie.leetcode.array;

//645. 错误的集合
//        集合 s 包含从 1 到 n 的整数。不幸的是，因为数据错误，导致集合里面某一个数字复制了成了集合里面的另外一个数字的值，导致集合 丢失了一个数字 并且 有一个数字重复 。
//
//        给定一个数组 nums 代表了集合 S 发生错误后的结果。
//
//        请你找出重复出现的整数，再找到丢失的整数，将它们以数组的形式返回。
//
//
//
//        示例 1：
//
//        输入：nums = [1,2,2,4]
//        输出：[2,3]
//        示例 2：
//
//        输入：nums = [1,1]
//        输出：[1,2]
//
//
//        提示：
//
//        2 <= nums.length <= 104
//        1 <= nums[i] <= 104

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @author xiezhendong
 * @date 2021/12/1
 */
public class FindErrorNums {

    public static void main(String[] args) {
        FindErrorNums findErrorNums = new FindErrorNums();
        System.out.println(Arrays.toString(findErrorNums.findErrorNums(new int[]{3, 2, 3, 4, 6, 5})));
        System.out.println(Arrays.toString(findErrorNums.findErrorNums(new int[]{1, 2, 2, 4})));
        System.out.println(Arrays.toString(findErrorNums.findErrorNums(new int[]{1, 1})));
    }

    public int[] findErrorNums(int[] nums) {
        int[] errorNums = new int[2];

        int numAll = (1 + nums.length) * nums.length / 2;
        int numErrorAll = 0;
        int numError = 0;
        Set<Integer> errorNumSet = new HashSet<>();
        for (int num : nums) {
            if (!errorNumSet.contains(num)) {
                errorNumSet.add(num);
                numError = numError + num;
            }
            numErrorAll = numErrorAll + num;
        }
        errorNums[0] = numErrorAll - numError;
        errorNums[1] = numAll - numError;
        return errorNums;
    }
}
